#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define THREAD_COUNT 20000

// 初始化锁
static pthread_mutex_t mutex_lock = PTHREAD_MUTEX_INITIALIZER;
void *add_thread(void *arg)
{
    // 将接收的v参数转换为int指针
    int *p = (int *)arg;

    // 在操作数据，加锁
    pthread_mutex_lock(&mutex_lock);
    *p = *p + 1;
    // 在操作完后解锁
    pthread_mutex_unlock(&mutex_lock);
    return NULL;
}

int main(int argc, char const *argv[])
{
    pthread_t thread[THREAD_COUNT];

    int num = 0; // 被n个进程不断累加的变量

    // 启动20000个进程对num进行累加

    for (int i = 0; i < THREAD_COUNT; i++)
    {
        pthread_create(&thread[i], NULL, add_thread, &num);
    }

    // 等待所有进程结束
    for (int i = 0; i < THREAD_COUNT; i++)
    {
        pthread_join(thread[i], NULL);
    }

    // 打印累加结果 => 会比20000要小一些
    printf("累加结果：%d \n", num);

    // 销毁锁
    pthread_mutex_destroy(&mutex_lock);
    return 0;
}
